package com.wu.logger.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.wu.gconduit.common.constant.GconduitConstant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Wumeng
 * @Date 2022年04月26日 18:00
 */

@RestController
public class LoggerController {


    @PostMapping("/log")
    public String logger(@RequestParam("log") String log) {
//        给数据加时间戳
        log = addTs(log);
//        数据落盘（比如给离线数据使用）【使用loh4j提供的方法】
        saveToFile(log);
//        写入到kafka中
        sendToKafka(log);
        System.out.println(log);
        return "ok";
    }

    //    将日志发送到kafka，kafka的相关配置在application.properties中
//    使用KafkaTemplate
    @Autowired  //自动注入
            KafkaTemplate K_template;

    private void sendToKafka(String log) {
//        先创建一个kafka的生产者，然后调用生产者的send方法
//        进行判断，如果是启动日志，就写到TOPIC_STARTUP；如果是时间日志，就写到TOPIC_EVENT
//        默认是启动日志，使用TOPIC_STARTUP；如果日志中包含event，就把topic转换成TOPIC_EVENT
        String topic = GconduitConstant.TOPIC_STARTUP;
        if (log.contains("event")) {
            topic = GconduitConstant.TOPIC_EVENT;
        }
        K_template.send(topic, log);
    }


    private final Logger logger = LoggerFactory.getLogger(LoggerController.class);

    //    日志写入到磁盘中，使用log4j来完成
    private void saveToFile(String log) {
        logger.info(log);
    }


    /**
     * 给日志添加时间戳
     *
     * @param log：原始日志
     * @return java.lang.String：添加了时间戳之后的日志
     * @author Wumeng
     * @date 2022/1/8 18:26
     */
    private String addTs(String log) {
//        先解析日志
        JSONObject obj = JSON.parseObject(log);
        obj.put("ts", System.currentTimeMillis());
        return obj.toJSONString();
    }

//    写磁盘，使用log4j，springboot内置的日志框架是logging，所以需要把logging去掉，换成log4j
}
